-- oracle 中单引号和双引号的区别
-- 双引号只用于 密码、关键字、表名、列名、别名中
-- 名字不加双引号，默认是大写，加了双引号保持默认
create table stu
(
    sid int
); -- 表名是STU
create table "eheh"
(
    eid int
);
-- 表名是 eheh

-- 单引号 1 表示字符串
--       2 转义字符
select ''''
from DUAL;


/*
 函数
 */

-- 数字函数

-- 1.1 四舍五入
-- ceil(n) 大于等于n的最小整数
-- floor(n) 小于等于n的最大整数
-- round(n) n四舍五入取整数
-- round(n,m) n四舍五入取m位小数
select ceil(2.5), floor(2.5), round(2.5), round(2.4), round(3.6)
from DUAL;
select round(2.434, 2), round(3.6)
from DUAL;
-- 1.2 幂相关
-- sqrt(n) n 开方
-- pow(n,m) 求 n 的 m 次方
--
select sqrt(18), power(2, 4)
from DUAL;

-- 1.3 基本运算
-- mod(n,m) 求余
-- abs(n) 绝对值
-- trunc (n) 截取
-- trunc (n,m) 截取n,保留m 位小数
select mod(3, 7)
from DUAL;
select abs(-20)
from DUAL;
select trunc(13.456)
from DUAL;
select trunc(13.456,2)
from DUAL;


-- 转换函数
-- 2.1 to_date(char,fmt) 把字符串转为日期
select to_date('2001-11-28 12:14:15', 'yyyy-MM-dd HH24:mi:ss')
from DUAL;
-- 2.2 to_char() 日期转为字符串
select to_char(sysdate, 'yyyy-MM-dd')
from DUAL;
-- 中文要转义
select to_char(sysdate, 'yyyy"年"--MM"月"--dd"日"')
from DUAL;

-- 2.3 to_number
select to_number('12345.67', '$999,999,99')
from DUAL;



-- 字符串相关的函数
-- 3.1 length(str) 获取 str 的字符个数
select length('abc呵呵呵')
from DUAL;
-- 3.2 ascii(x) 获取字符 x 在编码表中 ascii 中的整数
select ascii('a')
from DUAL;
select ascii('秒')
from DUAL;
-- 3.3 trim(str) 去除两边空格 letim(str) 去除左边空格 rtrim(str) 去除右边空格
select concat('-----', trim('   1234 fdfad fdsfa')) || '---------'
from dual;
-- 3.4 concat(str1,str2) 字符串拼接 只能有两个参数
--  || 等价于 concat 可以拼接多个
-- 3.5 instr(str1,str2) 获取 在 str1 中，str2 第一次出现的位置，下标从1开始
select instr('abcabcabc', 'a')
from DUAL;
-- 3.5 instr(str1,str2,n) 获取 在 str1 中，str2 第一次出现的位置，下标从1开始,指定从 n 开始
select instr('abcabcabc', 'a', 2)
from DUAL;
-- 3.6 substr(str,startIndex) 从 starIndex 位置处截取到末尾
-- 3.6 substr(str,startIndex,length) 从 starIndex 位置处截取 length 个字符串
select substr('abcdefghijilmn', 2)
from DUAL;
select substr('abcdefghijilmn', 2, 2)
from DUAL;
-- 3.7 upper(str) 转大写
-- 3.8 lower(str) 转小写
select upper('abc12345'), lower('AAAAAAA')
from DUAL;

-- 日期函数
-- 4.1 sysdate 获取当前时间
-- 4.2 add_months(date,number) 在 date 的基础上添加 number 月
select sysdate, add_months(sysdate, 2)
from DUAL;
-- 4.3 round(date,'year'|'month'|'day') 获取 年/月/星 第一天
select round(sysdate, 'year'), round(sysdate, 'month'), round(sysdate, 'day')
from DUAL;
-- 4.4 last_day(date) 获取本月的最后一天
select last_day(sysdate)
from DUAL;
-- 4.5 extract 提取日期中的特定部分
select extract(YEAR from sysdate)          year,
       extract(month from sysdate)         month,
       extract(day from sysdate)           day,
       extract(hour from systimestamp) + 8 hour,
       extract(minute from systimestamp)   minute,
       extract(second from systimestamp)   seconde
from DUAL;

select trunc(sysdate, 'mm')
from DUAL;


-- 随机函数
-- 5.1 DBMS_RANDOM.RANDOM 随机一个数字
select DBMS_RANDOM.RANDOM
from DUAL;
-- 5.2 DBMS_RANDOM.VALUE(low,high) 随机一个数字,范围 (low,high]
select DBMS_RANDOM.VALUE(1, 5)
from DUAL;
-- 5.3 DBMS_RANDOM.STRING(x,n) 随机含有 n 位的字符串，类型由 x 决定
-- 'u', 'U' – 返回字符串是大写希腊字母

--'l', 'L' – 返回字符串是小写希腊字母

--'a', 'A' – 返回字符串混合大小写希腊字母

--'x', 'X' – 返回字符串混合大写希腊字母和数字

--'p', 'P' –返回字符串是任何可打印字符串

--其他字母返回的是大写希腊字母
select DBMS_RANDOM.STRING('i', 4)
from DUAL;
-- 5.4 sys_guid() 随机一个 32位 的 16进制的字符串
select sys_guid()
from DUAL;

--  nvl(x,value) 如果 x 为 null，返回 value，否则返回 x
--  nvl2(x,value1,value2) 如果 x 为 null，返回 value2，否则返回 value1
select nvl(null, 'abx')
from DUAL;
select nvl2(1, 'abc', 'abd')
from DUAL;






